package n3_临界区critical_zone;

import lombok.extern.slf4j.Slf4j;

/**
 * ----------------------------------
 *                                  /
 *      ----- 临界区------           /
 *                                  /
 * ==================================
 *
 * 一个程序运行多个线程本身是没有问题的
 * 问题出在多个线程访问[共享资源]
 *      多个线程读[共享资源]其实也没有问题
 *      在多个线程对[共享资源]读写操作时发生【指令交错】，就会出现问题
 * 一段代码块内如果存在对[共享资源]的多线程读写操作，称这段代码块为【临界区】
 *
 *  竞态条件： 多个线程在临界区内执行，由于代码的执行序列不同而导致结果无法预测
 */
@Slf4j(topic = "c.T1")
public class T1_临界区_异常结果 {

    /**
     * 以下案例：最终结果不是 0
     * 原因：A线程计算完 还未写入[-共享资源-]；B线程就开始从[-共享资源-]里取值；
     */
    static int counter = 0;
    public static void main(String[] args) throws InterruptedException {
        log.debug("----- begin -----");

        Thread t1 = new Thread(() -> {
            for (int i = 0; i < 5000; i++) {
                counter++;
            }
        }, "t1");
        Thread t2 = new Thread(() -> {
            for (int i = 0; i < 5000; i++) {
                counter--;
            }
        }, "t2");
        t1.start();
        t2.start();
        t1.join();
        t2.join();
        log.debug("----- end 最终结果是：{} -----",counter);
    }


}
